/****************************************************************
 **  Nombre: DAORelacionAlumnoProgramaEducativo.java                          *
 **  Version: 1.0.0                                             *
 **  Diagrama: GAPI v4.7.1                                      *
 **  Autor: Luis Jorge Uicab                        *
 **  Creado: 28-marzo-2013
 *   Caso de uso: MGPE1,MGPE2,MGPE3
 **  Modificado: 03-abril-2013 (Alonso Orozco)                                                *
 ***************************************************************/

package DAO;

import AccesoBD.AccesoBaseDatos;
import Dominio.ProgramaEducativo;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * DAO que realiza la conexion con la Base de datos y administra su contenido.
 */
public class DAORelacionAlumnoProgramaEducativo {
    private String TABLA_RELACION_ALUMNO_PROGRAMA_EDUCATIVO = "rel_alumno_pe";
    private String COLUMNA_CLAVE_RELACION = "id_rel_alumno_pe";
    private String COLUMNA_CLAVE_INFO_ALUMNO = "usuario_alumno";
    private String COLUMNA_CLAVE_PROGRAMA_EDUCATIVO = "clave_PE";
    private String COLUMNA_SEMESTRE = "semestre";
    private AccesoBaseDatos acceso;
    private Connection conexion = null;
    /**
     * Constructor de la clase
     */
    public DAORelacionAlumnoProgramaEducativo() {
        acceso = new AccesoBaseDatos();
        conexion = acceso.abrirConexion();
    }
    /**
     * Cierra la conexion a la base de datos.
     */
    public void cerrarConexionARelacionAlumnoProgramaEducativo() {
        acceso.cerrarConexion(conexion);
    }
    /**
     * Obtiene la clave de la relacion entre la informacion del alumno y el programa educativo.
     * @param claveInfoAlumno Clave de la informacion del alumno
     * @param claveProgramaEducativo Clave del programa educativo.
     * @return La clave de dicha relacion
     */
    public int obtenerClaveRelacion(int claveInfoAlumno, int claveProgramaEducativo){
        String queryBusqueda = "SELECT " + COLUMNA_CLAVE_RELACION+" FROM " + TABLA_RELACION_ALUMNO_PROGRAMA_EDUCATIVO
                + " WHERE " + COLUMNA_CLAVE_INFO_ALUMNO + " = '" + claveInfoAlumno +"' AND "
                + COLUMNA_CLAVE_PROGRAMA_EDUCATIVO + " = '" + claveProgramaEducativo +"'";
        try {
            Statement sentencia = acceso.crearSentenciaBD(conexion);
            ResultSet resultado = sentencia.executeQuery(queryBusqueda);
            resultado.first();
            if(resultado.getRow() != 0){
                int claveRelacion = resultado.getInt(1);
                return claveRelacion;
            } else {
                System.err.println("No se encontro clave relacionada");
                return -1;
            }
        } catch (SQLException ex) {
            System.err.println("Problemas de SQL:\n"+ex.toString());
            return -1;
        }
    }
    /**
     * Obtiene el programa educativo del alumno.
     * @param cveInfoAlumno Clave de la informacvion del alumno.
     * @return El programa educativo al cual pertenece el alumno. 
     */
    public ProgramaEducativo getProgramaEducativoAlumno(int cveInfoAlumno){
       ProgramaEducativo pe;
        try {
            DAOProgramaEducativo daope = new DAOProgramaEducativo();
            String getClvPE = "SELECT "+COLUMNA_CLAVE_PROGRAMA_EDUCATIVO+" FROM "+TABLA_RELACION_ALUMNO_PROGRAMA_EDUCATIVO+" WHERE "+COLUMNA_CLAVE_INFO_ALUMNO+"='"+cveInfoAlumno+"'";
            Statement sentencia = acceso.crearSentenciaBD(conexion);
            ResultSet resultado = sentencia.executeQuery(getClvPE);
            resultado.first();
            if(resultado.getRow()!=0){
                int clvPE = resultado.getInt(1);
                pe = daope.buscarPrograma(clvPE);
                return pe;
            }
        } catch (SQLException ex) {
            System.err.println("Problemas de SQL:\n"+ex.toString());
        }
        return null;
   }
    /**
     * Obtiene la clave del programa educativo del alumno.
     * @param clvInfoAlumno Clave de la informacion personal del alumno
     * @return La clave del programa educativo que pertenece el alumno.
     */
    public int obtenerClavePE(int clvInfoAlumno){
        int clavePE = 0;
        try {
            Statement sentenciaBusqueda = acceso.crearSentenciaBD(conexion);
            String querySrch ="SELECT " + COLUMNA_CLAVE_PROGRAMA_EDUCATIVO + " FROM " + TABLA_RELACION_ALUMNO_PROGRAMA_EDUCATIVO + " WHERE " 
                    + COLUMNA_CLAVE_INFO_ALUMNO + " = '" + clvInfoAlumno + "'";
            ResultSet registros = sentenciaBusqueda.executeQuery(querySrch);
            while(registros.next()){
            clavePE = (int) registros.getObject(1);
            }
        } catch (SQLException ex) {
            Logger.getLogger(DAOInformacionAlumno.class.getName()).log(Level.SEVERE, null, ex);
        }
        return clavePE;
    }
    /**
     * Obtiene la clave de la relacion entre el alumno y el programa educativo.
     * @param clvInfoAlumno
     * @return la clave de la relacion entre el alumno y el programa educativo.
     */
    public int obtenerClaveRelacionAlumnoPE(int clvInfoAlumno){
        int clavePE = 0;
        try {
            Statement sentenciaBusqueda = acceso.crearSentenciaBD(conexion);
            String querySrch ="SELECT " + COLUMNA_CLAVE_RELACION + " FROM " + TABLA_RELACION_ALUMNO_PROGRAMA_EDUCATIVO + " WHERE " 
                    + COLUMNA_CLAVE_INFO_ALUMNO + " = '" + clvInfoAlumno + "'";
            ResultSet registros = sentenciaBusqueda.executeQuery(querySrch);
            while(registros.next()){
            clavePE = registros.getInt(1);
            }
        } catch (SQLException ex) {
            Logger.getLogger(DAOInformacionAlumno.class.getName()).log(Level.SEVERE, null, ex);
        }
        return clavePE;
    }
/**
 * Verifica si existe un alumno relacionado con un programa educativo.
 * @param claveIntPE Clave del programa educativo
 * @return True si existe el alumno, false en caso contrario.
 */
    public boolean existeAlumnoRelacionadoConPE(int claveIntPE) {
        boolean existe = false;
        try {
            Statement sentencia = acceso.crearSentenciaBD(conexion);
            String query = "SELECT * FROM " + TABLA_RELACION_ALUMNO_PROGRAMA_EDUCATIVO + " WHERE " + COLUMNA_CLAVE_PROGRAMA_EDUCATIVO
                    + " ='" + claveIntPE + "'";
            ResultSet resultado = sentencia.executeQuery(query);
            if (resultado.first()) {
                existe = true;
            }
        } catch (SQLException ex) {
            System.out.println("Ocurrió un problema al intentar recuperar la asignatura como requerimiento académico.\n");
        }
        return existe;
    }
    /**
     * Obtiene el semestre del alumno
     * @param claveRelacionAlumnoPE Clave de la relacion entre el alumno y el programa educativo.
     * @return Semestre del alumno.
     */
    public int obtenerSemestreDelAlumno(int claveRelacionAlumnoPE){
        int semestre = -1;
        
        try {
            Statement sentencia = acceso.crearSentenciaBD(conexion);
            String query = "SELECT "+COLUMNA_SEMESTRE+" FROM " + TABLA_RELACION_ALUMNO_PROGRAMA_EDUCATIVO + " WHERE " + COLUMNA_CLAVE_RELACION
                    + " ='" + claveRelacionAlumnoPE + "'";
            ResultSet resultado = sentencia.executeQuery(query);
            
            while(resultado.next()) {
                int claveSemestre = resultado.getInt(1);
                
                DAOSemestres daoSemestre = new DAOSemestres();
                semestre = daoSemestre.obtenerSemestre(claveSemestre);
                daoSemestre.cerrarConexionASemestres();
            }
            
        } catch (SQLException ex) {
            Logger.getLogger(DAORelacionAlumnoProgramaEducativo.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        return semestre;
    }
    /**
     * Obtiene la clave del semestre del alumno segun la base de datos.
     * @param claveRelacionAlumnoPE Clave de la relacion entre programa educativo y alumno  
     * @return Clave del semestre del alumno.
     */
    public int obtenerClaveDeSemestreDelAlumno(int claveRelacionAlumnoPE){
        int claveSemestre = -1;
        
        try {
            Statement sentencia = acceso.crearSentenciaBD(conexion);
            String query = "SELECT "+COLUMNA_SEMESTRE+" FROM " + TABLA_RELACION_ALUMNO_PROGRAMA_EDUCATIVO + " WHERE " + COLUMNA_CLAVE_RELACION
                    + " ='" + claveRelacionAlumnoPE + "'";
            ResultSet resultado = sentencia.executeQuery(query);
            
            while(resultado.next()) {
                claveSemestre = resultado.getInt(1);                               
            }
            
        } catch (SQLException ex) {
            Logger.getLogger(DAORelacionAlumnoProgramaEducativo.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        return claveSemestre;
    }
/**
 * Actualiza la relacion entre un alumno y un programa educativo.
 * @param clavePE Clave del programa educativo
 * @param semestre Numerop de semestre del alumno
 */
    public void actualizarRelacionAlumnoPE(int clavePE, int semestre) {
      try {
            Statement sentencia = acceso.crearSentenciaBD(conexion);
            String queryUpdate = "UPDATE " + TABLA_RELACION_ALUMNO_PROGRAMA_EDUCATIVO + " SET "
                    + COLUMNA_SEMESTRE + " = '" + semestre + "' "
                    + " WHERE " + COLUMNA_CLAVE_PROGRAMA_EDUCATIVO + " = '" + clavePE + "'";
            sentencia.executeUpdate(queryUpdate);
        } catch (SQLException ex) {
            System.err.println("Problemas de SQL:\n"+ex.toString());
        }
    }
/**
 * Actualiza la relacion entre el alumno y si programa educativo
 * @param clavePEActual Clave del programa educativo actual
 * @param clavePENueva Clave del nuevo programa educativo
 * @param semestre El semestre del alumno
 */
    public void actualizarRelacionAlumnoPE(int clavePEActual, int clavePENueva, int semestre) {
        try {
            Statement sentencia = acceso.crearSentenciaBD(conexion);
            String queryUpdate = "UPDATE " + TABLA_RELACION_ALUMNO_PROGRAMA_EDUCATIVO + " SET "
                    + COLUMNA_SEMESTRE + " = '" + semestre + "' , "
                    + COLUMNA_CLAVE_PROGRAMA_EDUCATIVO + " = '" + clavePENueva + "' "
                    + " WHERE " + COLUMNA_CLAVE_PROGRAMA_EDUCATIVO + " = '" + clavePEActual + "'";
            sentencia.executeUpdate(queryUpdate);
        } catch (SQLException ex) {
            System.err.println("Problemas de SQL:\n"+ex.toString());
        }
    }
}
